﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo522_1
{
    
    class Program
    {
      /*  编写一个程序，以实现机器人的层次结构，此层次结构将至少包含抽象类机器人类Robot、炒菜机器人类CookRobot、
            传菜机器人类DeliveryRobot。

            Robot类应包含机器人姓名name字段、机器人工作的方法Working()，该方法应该在子类中被实现，机器人工作的方式很多，
            所以Working()方法应该被定义为抽象方法。

            在CookRobot中添加一个代表菜的类型的字段，用枚举类型；
            在DeliveryRobot中添加一个代表连续工作时长的字段hours。
            CookRobot和DeliveryRobot应实现具体的Working()方法。

            在主类中定义一个方法，形参数据类型是string，返回值数据类型是Robot，
            方法中实现：
            如果传入的字符串是“炒菜”，那就返回CookRobot的实例（当然是要用Robot的引用指向的），
            如果传入的字符串是“传菜”，那就返回DeliveryRobot的实例。

            Main方法中：用户输入所选择的机器人的功能，根据用户的输入Robot执行对应的功能。*/
        static void Main(string[] args)
        {
            Robot robot;
            while (true)
            {
                Console.WriteLine("1.炒菜，2.传菜");
                Console.WriteLine("请输入您的选择：");
                string s = Console.ReadLine();
                switch (s)
                {
                    case "1":
                        robot = Test("炒菜");
                        break;
                    case "2":
                        robot = Test("传菜");
                        break;
                    default:
                        Console.WriteLine("输入错误，请重新输入");
                        continue;
                }
                //能走到这个break就说明输入没问题，goto要改两行 加break只要改一行
                break;
            }
             robot.Working();
        
        }
        public static Robot Test(string s)
        {
            Robot robot=new CookRobot();

            if (s =="炒菜")
            {
                //调用Enum类型中的GetNames方法 传 typeof(枚举类型) 返回一个string类型的数组
                string[] fds = Enum.GetNames(typeof(Foods));
                Console.WriteLine("今天的菜单，输入数字选择：");

                //遍历数组找到每个菜的索引 打印
                for (int i = 0; i < fds.Length; i++)
                {
                    //菜单变成一行，菜中间空4个空格
                    //Console.Write((i + 1) + "." + fds[i] + "\t");

                    //菜品独立一行显示
                    Console.WriteLine((i + 1) + "." + fds[i]);
                }
                //定义一个变量接受用户选择
                int a;
                //死循环 直到用户输入对了跳出循环 避免索引越界或误输入
                while (true)
                {
                    Console.WriteLine("请输入您的选择");
                    a = int.Parse(Console.ReadLine());
                    //判断用户输入是否 在索引范围内
                    if (a - 1 < fds.Length && a - 1 >= 0)
                    {
                        //如果 在范围内 则跳出循环
                        break;
                    }
                    //如果 不在范围内 则继续循环
                    else
                    {
                        Console.WriteLine("输入错误，请重新输入");
                    }
                }
                //需要将用户指定的菜 从string类型转换到Enum枚举类型 最后强制转换到自定义的Foods枚举类型
                Foods fd = (Foods)Enum.Parse(typeof(Foods), fds[a - 1]);

                
                Console.WriteLine("请给机器人取个名");
                string name = Console.ReadLine();

                
               robot = new CookRobot(name, fd);
            }
            if (s== "传菜")
            {
                //定义string  接收用户输入值
                string num;
                //定义double 确定真实工作时长
                double realNum;
                //死循环 直到用户输入对了跳出循环 避免误输入
                while (true)
                {
                    Console.WriteLine("请输入机器人连续工作时长,");
                    num = Console.ReadLine();
                    //double.TryParse尝试转换 传递用户输入字符串和转换后的工作时长
                    bool res = double.TryParse(num, out realNum);
                    if (res)
                    {
                        //如果 对了 则跳出循环
                        break;
                    }
                        //如果 不对 则继续循环
                    else
                    {
                        Console.WriteLine("输入错误，请重新输入");
                    }
                }

                Console.WriteLine("请给机器人取个名");
                string name = Console.ReadLine();

                robot = new DeliveryRobot(name, realNum);
            }

            return robot;
        }
    }
}
